package com.gzc.just.play.last.war.sceneserver.repository;

import com.gzc.just.play.last.war.sceneserver.battle.model.BattleInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 战斗数据访问接口
 * 
 * 提供战斗相关的数据库操作方法
 * 作为Phase 4.3数据库持久化集成的一部分
 */
@Repository
public interface BattleRepository extends JpaRepository<BattleInfo, Long> {
    
    /**
     * 根据状态查找战斗
     */
    List<BattleInfo> findByStatus(Integer status);
    
    /**
     * 查找进行中的战斗
     */
    List<BattleInfo> findBattlesByStatus(Integer status);
    
    /**
     * 根据地图ID查找战斗
     */
    List<BattleInfo> findByMapId(Integer mapId);
    
    /**
     * 根据战斗类型查找战斗
     */
    List<BattleInfo> findByBattleType(Integer battleType);
    
    /**
     * 根据玩家ID查找参与的战斗
     */
    @Query("SELECT b FROM BattleInfo b JOIN b.battleUsers users WHERE users.userId = :playerId")
    List<BattleInfo> findByPlayerId(@Param("playerId") Long playerId);
    
    /**
     * 根据玩家ID查找参与的战斗（分页）
     */
    @Query("SELECT b FROM BattleInfo b JOIN b.battleUsers users WHERE users.userId = :playerId")
    Page<BattleInfo> findByPlayerId(@Param("playerId") Long playerId, Pageable pageable);
    
    /**
     * 查找指定时间范围内的战斗
     */
    List<BattleInfo> findByStartTimeBetween(Long startTime, Long endTime);
    
    /**
     * 查找指定时间范围内的战斗（分页）
     */
    Page<BattleInfo> findByStartTimeBetween(Long startTime, Long endTime, Pageable pageable);
    
    /**
     * 查找超时的战斗
     */
    @Query("SELECT b FROM BattleInfo b WHERE b.status = 0 AND b.startTime < :timeoutTime")
    List<BattleInfo> findTimedOutBattles(@Param("timeoutTime") Long timeoutTime);
    
    /**
     * 统计指定状态的战斗数量
     */
    long countByStatus(Integer status);
    
    /**
     * 统计指定地图的战斗数量
     */
    long countByMapId(Integer mapId);
    
    /**
     * 统计指定类型的战斗数量
     */
    long countByBattleType(Integer battleType);
    
    /**
     * 统计玩家参与的战斗数量
     */
    @Query("SELECT COUNT(b) FROM BattleInfo b JOIN b.battleUsers users WHERE users.userId = :playerId")
    long countByPlayerId(@Param("playerId") Long playerId);
    
    /**
     * 查找玩家最近的战斗记录
     */
    @Query("SELECT b FROM BattleInfo b JOIN b.battleUsers users WHERE users.userId = :playerId ORDER BY b.startTime DESC")
    List<BattleInfo> findRecentBattlesByPlayerId(@Param("playerId") Long playerId, Pageable pageable);
    
    /**
     * 查找玩家胜利的战斗记录
     */
    @Query("SELECT b FROM BattleInfo b JOIN b.battleUsers users WHERE users.userId = :playerId AND users.isWinner = true ORDER BY b.startTime DESC")
    List<BattleInfo> findWonBattlesByPlayerId(@Param("playerId") Long playerId, Pageable pageable);
    
    /**
     * 查找最近一小时的战斗
     */
    @Query("SELECT b FROM BattleInfo b WHERE b.startTime >= :oneHourAgo ORDER BY b.startTime DESC")
    List<BattleInfo> findRecentBattles(@Param("oneHourAgo") Long oneHourAgo);
    
    /**
     * 删除战斗记录
     */
    @Modifying
    @Transactional
    @Query("DELETE FROM BattleInfo b WHERE b.battleId = :battleId")
    int deleteByBattleId(@Param("battleId") Long battleId);
}